package com.cencat.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.order.entity.Route;
import com.cencat.order.vo.RouteVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;

/**
 * 路线信息数据访问层接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Mapper
public interface RouteMapper extends BaseMapper<Route> {

    /**
     * 分页查询路线列表
     *
     * @param page 分页参数
     * @param routeName 路线名称(模糊查询)
     * @param routeCode 路线编号(模糊查询)
     * @param routeType 路线类型
     * @param routeStatus 路线状态
     * @param startPoint 起点(模糊查询)
     * @param endPoint 终点(模糊查询)
     * @param priority 优先级
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 路线分页列表
     */
    IPage<RouteVO> selectRoutePage(Page<RouteVO> page,
                                 @Param("routeName") String routeName,
                                 @Param("routeCode") String routeCode,
                                 @Param("routeType") String routeType,
                                 @Param("routeStatus") Integer routeStatus,
                                 @Param("startPoint") String startPoint,
                                 @Param("endPoint") String endPoint,
                                 @Param("priority") Integer priority,
                                 @Param("startTime") LocalDateTime startTime,
                                 @Param("endTime") LocalDateTime endTime);

    /**
     * 根据路线编号查询路线信息
     *
     * @param routeCode 路线编号
     * @return 路线信息
     */
    RouteVO selectByRouteCode(@Param("routeCode") String routeCode);

    /**
     * 根据起点和终点查询路线
     *
     * @param startPoint 起点
     * @param endPoint 终点
     * @param routeType 路线类型
     * @return 路线列表
     */
    List<RouteVO> selectByStartAndEndPoint(@Param("startPoint") String startPoint,
                                         @Param("endPoint") String endPoint,
                                         @Param("routeType") String routeType);

    /**
     * 查询指定范围内的路线
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param radius 搜索半径(公里)
     * @param routeType 路线类型
     * @return 路线列表
     */
    List<RouteVO> selectRoutesInRange(@Param("longitude") BigDecimal longitude,
                                    @Param("latitude") BigDecimal latitude,
                                    @Param("radius") BigDecimal radius,
                                    @Param("routeType") String routeType);

    /**
     * 查询最优路线推荐
     *
     * @param startLongitude 起点经度
     * @param startLatitude 起点纬度
     * @param endLongitude 终点经度
     * @param endLatitude 终点纬度
     * @param vehicleType 车辆类型
     * @param loadCapacity 载重要求
     * @param volumeCapacity 体积要求
     * @param timeWindow 时间窗口
     * @param limit 推荐数量限制
     * @return 最优路线列表
     */
    List<RouteVO> selectOptimalRoutes(@Param("startLongitude") BigDecimal startLongitude,
                                    @Param("startLatitude") BigDecimal startLatitude,
                                    @Param("endLongitude") BigDecimal endLongitude,
                                    @Param("endLatitude") BigDecimal endLatitude,
                                    @Param("vehicleType") String vehicleType,
                                    @Param("loadCapacity") BigDecimal loadCapacity,
                                    @Param("volumeCapacity") BigDecimal volumeCapacity,
                                    @Param("timeWindow") String timeWindow,
                                    @Param("limit") Integer limit);

    /**
     * 查询路线统计信息
     *
     * @param routeId 路线ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> selectRouteStatistics(@Param("routeId") Long routeId,
                                             @Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime);

    /**
     * 更新路线状态
     *
     * @param routeId 路线ID
     * @param routeStatus 路线状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateRouteStatus(@Param("routeId") Long routeId,
                         @Param("routeStatus") Integer routeStatus,
                         @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新路线优先级
     *
     * @param routeId 路线ID
     * @param priority 优先级
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateRoutePriority(@Param("routeId") Long routeId,
                           @Param("priority") Integer priority,
                           @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新路线成本信息
     *
     * @param routeId 路线ID
     * @param fuelCost 燃油成本
     * @param tollCost 过路费成本
     * @param laborCost 人工成本
     * @param totalCost 总成本
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateRouteCost(@Param("routeId") Long routeId,
                       @Param("fuelCost") BigDecimal fuelCost,
                       @Param("tollCost") BigDecimal tollCost,
                       @Param("laborCost") BigDecimal laborCost,
                       @Param("totalCost") BigDecimal totalCost,
                       @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新路线时间窗口
     *
     * @param routeId 路线ID
     * @param startTimeWindow 开始时间窗口
     * @param endTimeWindow 结束时间窗口
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateRouteTimeWindow(@Param("routeId") Long routeId,
                             @Param("startTimeWindow") LocalTime startTimeWindow,
                             @Param("endTimeWindow") LocalTime endTimeWindow,
                             @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量更新路线状态
     *
     * @param routeIds 路线ID列表
     * @param routeStatus 路线状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchUpdateRouteStatus(@Param("routeIds") List<Long> routeIds,
                              @Param("routeStatus") Integer routeStatus,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询路线使用频率统计
     *
     * @param routeId 路线ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 使用频率统计信息
     */
    Map<String, Object> selectRouteUsageStatistics(@Param("routeId") Long routeId,
                                                  @Param("startTime") LocalDateTime startTime,
                                                  @Param("endTime") LocalDateTime endTime);

    /**
     * 查询路线效率统计
     *
     * @param routeId 路线ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 效率统计信息
     */
    Map<String, Object> selectRouteEfficiencyStatistics(@Param("routeId") Long routeId,
                                                       @Param("startTime") LocalDateTime startTime,
                                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 查询路线成本统计
     *
     * @param routeId 路线ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 成本统计信息
     */
    Map<String, Object> selectRouteCostStatistics(@Param("routeId") Long routeId,
                                                 @Param("startTime") LocalDateTime startTime,
                                                 @Param("endTime") LocalDateTime endTime);

    /**
     * 查询热门路线排行榜
     *
     * @param limit 查询数量限制
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param routeType 路线类型
     * @return 路线排行榜
     */
    List<Map<String, Object>> selectTopRoutes(@Param("limit") Integer limit,
                                             @Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime,
                                             @Param("routeType") String routeType);

    /**
     * 查询路线分布统计
     *
     * @param routeType 路线类型
     * @return 路线分布统计信息
     */
    List<Map<String, Object>> selectRouteDistributionStatistics(@Param("routeType") String routeType);

    /**
     * 查询路线距离分布统计
     *
     * @return 路线距离分布统计信息
     */
    List<Map<String, Object>> selectRouteDistanceDistributionStatistics();

    /**
     * 查询路线时长分布统计
     *
     * @return 路线时长分布统计信息
     */
    List<Map<String, Object>> selectRouteDurationDistributionStatistics();

    /**
     * 查询路线类型分布统计
     *
     * @return 路线类型分布统计信息
     */
    List<Map<String, Object>> selectRouteTypeDistributionStatistics();

    /**
     * 查询路线优化建议
     *
     * @param routeId 路线ID
     * @return 优化建议列表
     */
    List<Map<String, Object>> selectRouteOptimizationSuggestions(@Param("routeId") Long routeId);

    /**
     * 查询相似路线
     *
     * @param routeId 路线ID
     * @param similarity 相似度阈值
     * @param limit 查询数量限制
     * @return 相似路线列表
     */
    List<RouteVO> selectSimilarRoutes(@Param("routeId") Long routeId,
                                    @Param("similarity") BigDecimal similarity,
                                    @Param("limit") Integer limit);

    /**
     * 查询路线拥堵情况
     *
     * @param routeId 路线ID
     * @param timeRange 时间范围
     * @return 拥堵情况信息
     */
    Map<String, Object> selectRouteCongestionInfo(@Param("routeId") Long routeId,
                                                 @Param("timeRange") String timeRange);

    /**
     * 查询路线天气影响
     *
     * @param routeId 路线ID
     * @param weatherCondition 天气条件
     * @return 天气影响信息
     */
    Map<String, Object> selectRouteWeatherImpact(@Param("routeId") Long routeId,
                                                @Param("weatherCondition") String weatherCondition);

    /**
     * 软删除路线信息
     *
     * @param routeId 路线ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int softDeleteRoute(@Param("routeId") Long routeId,
                       @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量软删除路线信息
     *
     * @param routeIds 路线ID列表
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchSoftDeleteRoutes(@Param("routeIds") List<Long> routeIds,
                             @Param("updateTime") LocalDateTime updateTime);

    /**
     * 恢复已删除的路线信息
     *
     * @param routeId 路线ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int restoreRoute(@Param("routeId") Long routeId,
                    @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询路线变更历史
     *
     * @param routeId 路线ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 变更历史列表
     */
    List<Map<String, Object>> selectRouteChangeHistory(@Param("routeId") Long routeId,
                                                      @Param("startTime") LocalDateTime startTime,
                                                      @Param("endTime") LocalDateTime endTime,
                                                      @Param("limit") Integer limit);
}